#ifndef RESERVA_HPP_
#define RESERVA_HPP_

#include <eosim/core/model.hpp>
#include <eosim/dist/normaldist.hpp>
#include <eosim/statics/timeweighted.hpp>
#include <eosim/statics/observation.hpp>
#include "leon.hpp"
#include "manada.hpp"
#include "constantes.hpp"
#include "events.hpp"

class Reserva: public eosim::core::Model
{
	private:
        double cantidadLeones;
        unsigned int porcentajeMachos;
        bool derriboMuro;

		// fin viaje macho
		EndViaje eVL;
		// inicio viaje macho
		StartViaje sVL;
		// Leon madura
		MaduracionLeon eML;
		// inicio crianza leona
		CrianzaCachorros cCH;
		// las leonas dan a luz
		NacimientoCamada eNC;
		// evento fijo de finalizacion de apareamiento de leonas
		EndApareamiento eAL;
		// evento condicional de comienzo de apareamiento de leonas
		StartApareamiento sAL;
       
public:


	// coleccion de manadas
	std::vector<Manada*> manadas;

    // disbribucion aleatoria de los tiempos de maduracion
	eosim::dist::NormalDist maduracion;


	// constructor del modelo
	Reserva(unsigned int cantManadas, unsigned int cantidadLeones, unsigned int porcentajeMachos, bool derriboMuro);
	// destructor del modelo
	~Reserva();
	// inicializa y registra los atributos del modelo, operacion abstracta de eosim::core::Model
	void init();
	// lleva al modelo a su estado inicial, operacion abstracta de eosim::core::Model
	void doInitialSchedules();
};

#endif


